import wechat from './system-service';
import userService from './user-service';
import alertService from './alter-service';
import storage from './storage-service';
import {LOGIN_STATUS, EVENT_BUS_KEY, API_WECHAT_LOGIN, STORAGE_USERINFO, USER_STATUS} from '../constants';
import {eventBusGetter} from '../../utils/eventbus';
import {getDecodeAndBind} from '../../data-model/model-login';
import {get} from '../../utils/http';
import {showLoadingToast} from './toast-service';
import { cleanCourseGlobalData } from '../service/courses-service';

/**
 * 在app初始化时执行微信登录及正和岛帐号登录操作
 * 并将当前用户状态发送EventBus进行通知
 * @param options
 */
function wxCheckSession (options) {
    let zhparam;
    console.log('开始检查session有效性: 微信登录', options);
    wechat.login()
        .then(wxLoginRes => {
            console.log('client登录成功', wxLoginRes);
            userService.setLoginStatus(LOGIN_STATUS.WX_LOGIN_SUCCESS);
            eventBusGetter().$emit(EVENT_BUS_KEY.LOGIN_STATUS_UPDATE, LOGIN_STATUS.WX_LOGIN_SUCCESS);
            return get(API_WECHAT_LOGIN, {'code': wxLoginRes.code});
        })
        .then(zhres => {
            // 临时变量复制
            zhparam = zhres;
            if (zhres.hasUnionId) {
                // 判断是否有unionId 如果有处理正和岛业务逻辑
                handleZhislandUser(zhparam);
                return Promise.resolve({noLookPass: true});
            } else {
                // 没有uid 也要先存储session 用于请求时与unionId关联
                userService.saveSession(zhres);
                // 如果没有获取加密向量和加密数据 发送给gateway后再向下传递
                return wechat.getWxUserInfo();
            }
        })
        .then(wxUserData => {
            if (wxUserData.noLookPass === true) {
                // hasUnionId 为 true
                return Promise.resolve(wxUserData);
            } else {
                // 发送给gateway 解密
                console.log('getWxUserInfo获取的数据', wxUserData);
                return getDecodeAndBind(wxUserData.encryptedData, wxUserData.iv);
            }
        })
        .then(decipherData => {
            // 解密后执行绑定 存在3种情况
            // 1. 新用户 没有uid, 服务端不能执行绑定 返回空
            // 2. 老用户 有uid, 执行绑定后并返回加密数据 为unionId
            // 3. 解密或绑定失败, 抛出异常 执行catch
            if (decipherData.noLookPass === true) {
                // hasUnionId 为 true 不进行任何操作
            } else {
                console.log('getWxUserInfo解密数据:', decipherData);
                // 处理正和岛用户业务逻辑
                handleZhislandUser(zhparam);
            }
        })
        .catch(zherr => {
            console.log('正和岛登录失败', zherr);
            userService.setLoginStatus(LOGIN_STATUS.SESSION_LOGIN_FAILED);
            eventBusGetter().$emit(EVENT_BUS_KEY.LOGIN_STATUS_UPDATE, LOGIN_STATUS.SESSION_LOGIN_FAILED);
            handleNotAuthority(zherr);
        });
}

// 打开设置重新授权执行操作
function reAuthority () {
    wechat.openSetting()
        .then(data => {
            // 授权成功
            if (data.authSetting['scope.userInfo'] === true) {
                wxCheckSession('重新checkSession');
                // 重新执行登录流程
            } else {
                console.log('授权未成功', data);
            }
        })
        .catch(err => {
            console.log('授权错误', err);
        });
}

// 微信拒绝授权处理逻辑
function handleNotAuthority (zherr) {
    if (zherr && (zherr.errMsg === 'getUserInfo:fail auth deny' || zherr.errMsg === 'getUserInfo:fail:auth deny')) {
        alertService.showAlertModel({
            title: '再次授权',
            content: '您点击了拒绝授权，您在使用过程中可能会出现问题，为了保证您正常使用，请点击“前往授权”进行授权。',
            showCancel: false,
            confirmText: '前往授权'
        }).then(res => {
            console.log(res);
            if (res.confirm) {
                // 跳转到授权
                reAuthority();
            }
        });
    }
}
// 处理正和岛用户业务逻辑
function handleZhislandUser (zhparam) {
    userService.saveSession(zhparam);
    userService.setLoginStatus(LOGIN_STATUS.SESSION_LOGIN_SUCCESS);
    eventBusGetter().$emit(EVENT_BUS_KEY.LOGIN_STATUS_UPDATE, LOGIN_STATUS.SESSION_LOGIN_SUCCESS);
    if (zhparam.user && zhparam.user.userId && zhparam.user.activity !== USER_STATUS.ACTIVITY_BAD && zhparam.user.activity !== USER_STATUS.ACTIVITY_FREEZE) {
        userService.saveUserData(zhparam.user);
        console.log('正和岛登录成功', zhparam);
        userService.setLoginStatus(LOGIN_STATUS.ZH_LOGIN_SUCCESS);
        eventBusGetter().$emit(EVENT_BUS_KEY.LOGIN_STATUS_UPDATE, LOGIN_STATUS.ZH_LOGIN_SUCCESS);
    } else {
        if (zhparam.user && zhparam.user.activity === USER_STATUS.ACTIVITY_BAD && zhparam.user.activity === USER_STATUS.ACTIVITY_FREEZE) {
            console.log('用户为黑名单或冻结');
            showLoadingToast('帐号异常');
        }
        console.log('不存在正和岛User');
        userService.setZHLogin(false);
        // 清理与课程有关的全局数据
        cleanCourseGlobalData();
        // 移除原有user 如果存在
        storage.removeStorageSync(STORAGE_USERINFO);
        userService.setUserInfo(undefined);
        // 此时应为用户未创建名片 globalData中cardDetail应为空 直接通知页面刷新卡片信息
        userService.setLoginStatus(LOGIN_STATUS.ZH_LOGIN_FAILED);
        eventBusGetter().$emit(EVENT_BUS_KEY.LOGIN_STATUS_UPDATE, LOGIN_STATUS.ZH_LOGIN_FAILED);
    }
}

module.exports = {
    wxCheckSession: wxCheckSession
};
